package com.runewbie.linkedlist.singlelinkedlist;

/**
 * @description: 使用带head头的单向链表实现 –水浒英雄排行榜管理 
 * 1、完成对英雄人物的增删改查操作， 注: 删除和修改,查找
 * 2、第一种方法在添加英雄时，直接添加到链表的尾部
 * @author: runewbie
 * @date: 2020年6月7日 下午12:01:05
 * @version V1.0（实现添加和遍历）
 *
 */
public class SingleLinkedListDemo {

	// 测试
	public static void main(String[] args) {
		// 创建节点
		HeroNode hero1 = new HeroNode(1, "宋江", "呼保义");
		HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
		HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
		HeroNode hero4 = new HeroNode(4, "公孙胜", "入云龙");

		// 创建链表
		SingleLinkedList singleLinkedList = new SingleLinkedList();

		// 添加节点
		singleLinkedList.add(hero1);
		singleLinkedList.add(hero4);
		singleLinkedList.add(hero2);
		singleLinkedList.add(hero3);

		// 遍历显示
		singleLinkedList.list();
	}

}

// 定义SingleLinkedList管理水浒英雄
class SingleLinkedList {
	// 先初始化一个头结点，头结点不动，不存放具体的数据
	private HeroNode head = new HeroNode(0, null, null);

	// 添加节点到单向链表
	// 思路：当不考虑编号的顺序时
	// 1、找到当前链表的最后节点
	// 2、将最后这个节点的next指向新的节点
	public void add(HeroNode heroNode) {
		// 因为head节点不能动，因此我们需要一个辅助遍历 temp
		HeroNode temp = head;
		// 遍历链表，找到最后
		while (true) {
			// 找到链表的最后
			if (temp.next == null) {
				break;
			}
			// 如果没有找到最后，将temp后移
			temp = temp.next;
		}
		// 当退出while循环时，temp指向了链表的最后
		// 将最后这个节点的next指向新的节点
		temp.next = heroNode;
	}

	// 显示链表[遍历]
	public void list() {
		// 判断链表是否为空
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}
		// 因为头节点不能动，因此需要一个辅助变量来进行遍历
		HeroNode temp = head.next;
		while (true) {
			// 判断是否到了链表最后
			if (temp == null) {
				break;
			}
			// 输出节点的信息
			System.out.println(temp);
			// * 将temp后移，一定要小心，这里要是不后移的话，会导致死循环
			temp = temp.next;
		}
	}

}

//定义HeroNode，每个 HeroNode对象就是一个节点
class HeroNode {
	public int no;
	public String name;
	public String nickName;
	public HeroNode next;// 指向下一个节点
	// 构造器

	public HeroNode(int no, String name, String nickName) {
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}

	// 为了显示方便，我们重写toString
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
	}
}